package com.lanou3g.code0411;

import com.lanou3g.code0411.exceptions.IndexOutException;

/**
 * If there are no bugs, it was created by Chen FengYao on 2018/4/11;
 * Otherwise, I don't know who created it either
 */
// 用起来 和数组差不多 一个啥都能放的容器
// 并且 还不需要指定初始化长度
// 能随着 里面内容的多少, 变大变小

    // 现在的问题是
    // 使用的是Object类型,啥都能放
    // 如果 我们能够 在创建 MyArray的时候,就能确定
    // 这个数组中 可以放的元素类型,那么在取出元素的时候
    // 就不会产生 类型转换异常了
public class MyArray<E> {
    // 动态数组扩容
    private Object[] datas; // 用来放元素的数组
    private int count; // 当前数组中已经存放的元素个数

    public MyArray() {
        // 我们上来就定义一个能放10个元素的数组
        // 之所以取10, 是因为 我手写的
        datas = new Object[10];
        count = 0;
    }

    public void put(E object) {
        // 放元素
        datas[count] = object;
        count++;
        // 放满了 怎么办?
        if (count == datas.length){
            //放满了
            // 创建一个新数组,是原来数组长度的2倍
            Object[] newArr = new Object[datas.length * 2];
            // 把旧数组中的所有元素放到新数组中
            for (int i = 0; i < datas.length; i++) {
                newArr[i] = datas[i];
            }

            //把 datas 赋值成新的 大的 数组
            datas = newArr;
        }
    }

    public E get(int index) {
        //使用异常机制来解决
        // 根据下标取元素
        if (index < 0 || index >= count){
            // 如果 输入的索引 超出了我们支持的范围
            // 那么我们就让程序崩溃,并给出确切的错误信息
            throw new IndexOutException(count - 1, index);
        }
        return (E)datas[index];
    }

    public void remove(int index) {
        // 根据下标 删除元素

    }

    // 用来确定 有多少元素
    public int size(){
        return count;
    }

}
